package com.example.easyexcel.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.easyexcel.dao.AssetReportInfoMapper;
import com.example.easyexcel.dto.AssetReportInfo;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

@Slf4j
public class AssetReportInfoListener extends AnalysisEventListener<AssetReportInfo> {

    private final AssetReportInfoMapper mapper;
    private static final int BATCH_SIZE = 196; // 每XX条批量插入一次
    private List<AssetReportInfo> batchList = new ArrayList<>();

    public AssetReportInfoListener(AssetReportInfoMapper mapper) {
        this.mapper = mapper;
    }

    @Override
    public void invoke(AssetReportInfo dto, AnalysisContext context) {
//        单条插入
//        AssetReportInfo entity = new AssetReportInfo();
//        entity.setSystemName(dto.getSystemName());
//        entity.setReportNo(dto.getReportNo());
//        entity.setReportName(dto.getReportName());
//        entity.setReportDescr(dto.getReportDescr());
//        entity.setManagementSystem(dto.getManagementSystem());
//        entity.setManagementSystemPath(dto.getManagementSystemPath());
//        // 状态（映射成代码，例：正常=1，停用=0）
//        entity.setReportSc("正常".equals(dto.getReportStatus()) ? 1 : 0);
//        entity.setDescr(dto.getDescr());
//        entity.setTimeliness(dto.getTimeliness());
//        entity.setTimelinessDescr(dto.getTimelinessDescr());
//        entity.setDataQueryRange(dto.getDataQueryRange());
//        entity.setDelFlag(0L);
//        mapper.insert(entity);
        //批量插入
        AssetReportInfo entity = convertToEntity(dto);
        batchList.add(entity);
        // 达到批量大小时执行插入
        if (batchList.size() >= BATCH_SIZE) {
            saveBatch();
            batchList.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 处理最后一批数据
        if (!batchList.isEmpty()) {
            saveBatch();
        }
        log.info("Excel 导入完成");
    }
    private void saveBatch() {
        if (!batchList.isEmpty()) {
            mapper.insertBatch(batchList);
            log.info("批量插入 {} 条数据", batchList.size());
        }
    }
    // 类级静态变量：用于生成全局唯一的自增序列（初始值为1，可根据需求调整）
    private static AtomicLong assetNoCounter = new AtomicLong(0);

    private AssetReportInfo convertToEntity(AssetReportInfo dto) {
        AssetReportInfo entity = new AssetReportInfo();
        entity.setSystemName(dto.getSystemName());
        entity.setReportNo(dto.getReportNo());

        // 核心修改：生成"RP"+9位自增序列（替换原null设置）
        String assetNoPrefix = "RP"; // 2位固定编码
        long sequence = assetNoCounter.getAndIncrement(); // 原子递增，线程安全
        String assetNo = assetNoPrefix + String.format("%09d", sequence); // 格式化为9位（补零）
        entity.setAssetNo(assetNo); // 设置assetNo

        // 以下代码保持不变（状态转换、时间等设置）
        entity.setReportName(dto.getReportName());
        entity.setReportDescr(dto.getReportDescr());
        entity.setManagementSystem(dto.getManagementSystem());
        entity.setManagementSystemPath(dto.getManagementSystemPath());

        // 修改您提供的代码段
        if (dto.getReportStatus() == null) {
            throw new RuntimeException("状态不可为空");
        } else {
            String status = dto.getReportStatus();
            // 根据状态内容设置相应的代码
            if (status.contains("已迁移")) {
                entity.setReportSc(0);
            } else if (status.contains("迁移中")) {
                entity.setReportSc(1);
            } else if (status.contains("下线") || status.contains("已下线")) {
                entity.setReportSc(2);
            } else if (status.contains("已删除")) {
                entity.setReportSc(3);
            }
        }
        // 时间及其他属性设置
        LocalDateTime now = LocalDateTime.now();
        entity.setCreateTime(now);
        entity.setUpdateTime(now);
        entity.setDescr(dto.getDescr());
        entity.setTimeliness(dto.getTimeliness());
        entity.setTimelinessDescr(dto.getTimelinessDescr());
        entity.setDataQueryRange(dto.getDataQueryRange());
        entity.setDelFlag(0L);
        entity.setDelTime(null);

        return entity;
    }

}
